#ifndef MYDATA_H
#define MYDATA_H
/*************************************************
 *	文件名称：mydata.h
 *	文件说明：	文件为线性表的基本定义，提供了
				元素的基本定义
				1.线性表构建函数的声明
				2.线性表销毁函数的声明
				3.线性表重置函数的声明
				4.线性表判断是否为空函数的声明
				5.线性表提取元素个数函数的声明
				6.线性表提取元素函数的声明
				7.线性表提取元素个数函数的声明
				等等·····

 *	程序平台：for linux
 *	文件作者：Jason <jasonsunsoft@163.com>
 *	文件时间：
*************************************************/

#include <stdlib.h>
#include "../../common.h"

#define LIST_INIT_SIZE      100     //线性表存储空间初始分配量
#define LISTINCREMENT       10      //线性表存储空间的分配增量
/*
typedef struct {
	int a;
}ElemType;*/
typedef int ElemType;

typedef struct {
	ElemType *elem;                 //存储空间基址
	int length;                     //当前长度
	int listsize;                   //当前分配的存储容量（以sizeof(ElemType)为单位）
}SqList;

//-------------- 基本操作的函数说明---------------
Status InitList_Sq(SqList *L );
	//操作结果：构造一个空的线性表L。

Status DestroyList_Sq(SqList *L);
	//初始条件：线性表L已存在
	//操作结果：销毁线性表L。

Status ClearList_Sq(SqList *L);
	//初始条件：线性表L已存在
	//操作结果：将L重置为空表。

Status ListEmpty_Sq(SqList L);
	//初始条件：线性表L已存在
	//操作结果：若L为空表，则返回TRUE，否则返回FALSE。

int ListLength_Sq(SqList L);
	//初始条件：线性表L已存在
	//操作结果：返回L中数据元素个数

Status GetElem_Sq(SqList L, int i, ElemType *e);
	//初始条件：线性表L已存在,1 <= i <= ListLength( L)。
	//操作结果：用 e 返回L中第i个元素的值。

int LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType, ElemType));
	//初始条件：线性表L已存在,compare()是元素判定函数。
	//操作结果：返回L中第一个与e满足关系compare()的数据元素的位序。若这样的数据元素不存在，则返回值为0。


Status PrioElem_Sq(SqList L, ElemType cur_e, ElemType *pre_e);
	//初始条件：线性表L已存在。
	//操作结果：若cur_e是L的数据元素，且不是第一个，则用pre_e返回它的前驱，否则操作失败，pre_e无定义。

Status NextElem_Sq(SqList L, ElemType cur_e, ElemType *next_e);
	//初始条件：线性表L已存在。
	//操作结果：若cur_e是L的数据元素，且不是最后一个，则用next_e返回它的后继，否则操作失败，next_e无定义。

Status  ListInsert_Sq(SqList *L, int i, ElemType e);
	//初始条件：线性表L已存在，1 <= i <= ListLength(L) + 1。
	//操作结果：在L中第i个位置之前插入新的数据元素e，L的长度加1

Status  ListDelete_Sq(SqList *L, int i, ElemType *e);
	//初始条件：线性表L已存在且非空，1 <= i <= ListLength(L)。
	//操作结果：删除L的第i个数据元素，并用e返回其值，L的长度减1

Status  ListTraverse_Sq(SqList L, Status (*visit)(ElemType e));
	//初始条件：线性表L已存在。
	//操作结果：依次对L的每个数据元素调用函数visit()。一旦visit()失败，操作失败。

void Union_Sq(SqList *La, SqList *Lb);
	//初始条件：线性表La、Lb已存在。
	//操作结果：将所有在线性表Lb中但不在La中的数据元素插入到La中

void MergelList_Sq(SqList La, SqList Lb, SqList *Lc);
	//初始条件：线性表La、Lb已存在， 且线性表La和Lb中的元素值按非递减排列。
	//操作结果：并归La和Lb得到新的线性表Lc，Lc的数据元素也按值非递减排列

Status equal(ElemType e1, ElemType e2);
Status PrinElem(ElemType e);

#endif //MYDATA_H
